package com.gitee.sparta.common;

/**
 * sparta 常量池
 *
 * @author zyred
 * @since v 0.0.1
 */
public class SpartaConstant {

    /** 英文冒号，用于 redis key 的连接 **/
    public static final String COLON = ":";

    /** 英文逗号 **/
    public static final String COMMA = ",";

    /** 英文横线 **/
    public static final String LINE = "-";

    /** 左花括号 **/
    public static final String LEFT_BRACKETS = "{";

    /** 右花括号 **/
    public static final String RIGHT_BRACKETS = "}";

    /** 重试间隔时间，默认 3s 下次重试时间为 当前时间 + 本值*/
    public static final int RETRY_INTERVAL = 3_000;

    /** 续期间隔时间，默认 30s，下次执行时间为 当前时间 + 本值 **/
    public static final int RENEW_INTERVAL = 30_000;

    /** 1s 对应的纳秒 **/
    public static final long NANOS = 1_000_000_000L;

    /** 1ms 与 纳秒的关系 **/
    public static final long NANOS_MILLISECONDS = 1000_000L;

    /** 容量 **/
    public static final int CAPACITY = 1024;

    /** 随机数最小 5 位数 **/
    public static final int MIN = 10000;
    /** 随机数最大 5 位数 **/
    public static final int MAX = 99999;

    /**
     * 读取 timeout_tab 的线程上一次读取返回的结果是 0，则会认为
     * timeout_tab 中没有任务需要消费 所以该线程需要进入睡眠状态，
     * 默认是睡眠是 10s
     */
    public static final int MAX_SLEEP_SEC = 10;

    /** DO_ACK: 执行了 ack 操作， DO_RENEW：执行了续期操作 **/
    public static final Integer DO_ACK = 2, DO_RENEW = 4;

    /** AUTO_ACK：自动 ack 标识   MANUAL_ACK：手动 ack 标识**/
    public static final Integer AUTO_ACK = 2, MANUAL_ACK = 1;

    /** metaId 自定义的 scope **/
    public static final Integer META_ID_MIN_LEN = 16, META_ID_MAX_LEN = 32;

    /**
     * 元数据表名，hash 结构，consumers 线程与 sparta 线程共享
     * key:     {system.name}:metadata_tab
     * filed:   topic:metaId
     * value:   {@see Metadata}
     */
    public static final String TABLE_METADATA_NAME = "metadata_tab";

    /**
     * 超时表名，ZSet 集合，sparta 线程私有的集合
     * key:     {system.name}:timeout_tab
     * score:   当前时间戳
     * value:   情况1：topic:metaId, 情况2：topic:metaId-0, topic:metaId-1, ...
     */
    public static final String TABLE_TIMEOUT_NAME = "timeout_tab";

    /**
     * 消费者可读的表名，Set 集合，sparta 线程负责写，consumers 线程负责读和删
     * key:     {system.name}:readable_tab:isolation:topic (isolation: 机器隔离策略，topic：监听者)
     * value:   情况1：topic:metaId, 情况2：topic:metaId-0, topic:metaId-1, ...
     */
    public static final String TABLE_READABLE_NAME = "readable_tab";

    /**
     * 未 ack 后 topic:metaId 的持久化存储表，Set 集合，consumers 线程私有
     * key:     {system.name}:deny_tab
     * value:   topic:metaId
     */
    public static final String TABLE_DENY_NAME = "deny_tab";

    /**
     * sparta 搬运线程名称，该线程是不会被销毁的
     * 工作内容：从 timeout_tab 中读取数据出来，放入到 readable_tab 中
     * 对于 timeout_tab 而言，该线程是读数据，所以有 r 后缀。
     */
    public static final String SPARTA_READ_THREAD_NAME = "sparta-r";

    /**
     * sparta 写 timeout_tab 线程的名称，该线程主要是处理从本地 queue 中读取数据，写入到
     * timeout_tab 和 metadata_tab 中，当然该方案也只是提供给用户异步插入的 api 才会调用
     * 此线程进入 worker 状态，本线程也是不会销毁的。
     * 对于 timeout_tab 而言，该线程是写数据，所以有 w 后缀.
     */
    public static final String SPARTA_WRIT_THREAD_NAME = "sparta-w";

    /**
     * sparta 中，调用用户自定义且标注了 @SpartaListener 注解的方法，如果用户在使用 sparta
     * 的时候配置了 sparta.consume-wait-time 大于 0S 的情况，则会启动此线程池来做超时管理
     */
    public static final String SPARTA_TIMEOUT_THREAD_NAME = "sparta-timeout";

    /**
     * sparta 系统中提供的广播功能，在新增的时候，需要给 topic 加上一个特殊的标识来标注广播
     */
    public static final String BROADCAST_PREFIX = "@";

    /**
     * sparta 中 topic 定义的限制， 只能是 字母,数字,下划线
     */
    public static final String TOPIC_REGEX = "^[0-9a-zA-Z_]{1,}$";

    /** 服务隔离取值范围 **/
    public static final int ISOLATION_LENGTH = 16;

    /** 协议头长度所占的字节长度 **/
    public static final int PROTO_HEAD_LEN = 4;

    /**
     *  hash map key
     *  LUA_SHA_KEY：加载 lua 脚本的 key 值
     */
    public static final String LUA_SHA_KEY = "sha";
    /**
     *  hash map key
     *  SCRIPT_KEY： 脚本
     */
    public static final String SCRIPT_KEY = "script";

    /** 服务信息注册表 */
    public static final String SERVICE_TABLE = "server_table";

    /** sha 摘要表 **/
    public static final String SHA_TABLE = "sha_table";

    /** 服务注册阶段，需要加上分布式锁 **/
    public static final String REGEDIT_LOCK = "sparta_regedit_lock";

    /** 服务降级分布式锁 **/
    public static final String DEMOTION_FOLLOWER_LOCK = "demotion_follower_lock";

    /** {@link SpartaLuaConstant#getWriteBroadcastScript()} */
    public static final String WRITE_BROADCAST = "getWriteBroadcastScript";

    /** {@link SpartaLuaConstant#getWriteSegmentScript()} */
    public static final String WRITE_SEGMENT = "getWriteSegmentScript";

    /** {@link SpartaLuaConstant#getWriteNormalScript()} */
    public static final String WRITE_NORMAL = "getWriteNormalScript";

    /** {@link SpartaLuaConstant#getCarryScript()} **/
    public static final String CARRY = "getCarryScript";

    /** {@link SpartaLuaConstant#getReadMetadataScript()} **/
    public static final String READ_METADATA = "getReadMetadataScript";

    /** {@link SpartaLuaConstant#getDelHaveReadInReadableTabScript()} **/
    public static final String DEL_HAVE_READ_IN_READABLE_TAB = "getDelHaveReadInReadableTabScript";

    /** {@link SpartaLuaConstant#getDelMetadataReadableTabScript()} **/
    public static final String DEL_METADATA_READABLE_TAB = "getDelMetadataReadableTabScript";

    /** {@link SpartaLuaConstant#getRenewAndRetryScript()} **/
    public static final String RENEW_AND_RETRY = "getRenewAndRetryScript";

    /** {@link SpartaLuaConstant#getDenyPersistenceScript()} **/
    public static final String DENY_PERSISTENCE = "getDenyPersistenceScript";

    /** {@link SpartaLuaConstant#getProcessDenysScript()} **/
    public static final String PROCESS_DENYS = "getProcessDenysScript";

    /** {@link SpartaLuaConstant#getDelSegmentReadableTabScript()} **/
    public static final String DEL_SEGMENT_READABLE_TAB = "getDelSegmentReadableTabScript";

    /** {@link SpartaLuaConstant#getDelSegmentFinishedConsumptionScript()} **/
    public static final String DEL_SEGMENT_FINISHED_CONSUMPTION = "getDelSegmentFinishedConsumptionScript";

    /** {@link SpartaLuaConstant#getDeleteScript()} **/
    public static final String DELETE = "getDeleteScript";

    /** {@link SpartaLuaConstant#getShutdownAfterRollbackScript()} **/
    public static final String SHUTDOWN_AFTER_ROLLBACK = "getShutdownAfterRollbackScript";

    /** {@link SpartaLuaConstant#getReadMetadataMapScript()} **/
    public static final String READ_METADATA_MAP = "getReadMetadataMapScript";

    /** {@link SpartaLuaConstant#getReadDelMetadataScript()} **/
    public static final String READ_DEL_METADATA_MAP = "getReadDelMetadataScript";

}
